package com.skiving.cloud.admin.controller;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.skiving.cloud.admin.entity.SysMenu;
import com.skiving.cloud.admin.entity.SysStationMenu;
import com.skiving.cloud.admin.service.SysMenuService;
import com.skiving.cloud.admin.service.SysStationMenuService;
import com.skiving.cloud.auth.util.UserUtil;
import com.skiving.cloud.common.utils.PageParameter;
import com.skiving.cloud.common.utils.ReturnT;
import com.skiving.cloud.common.utils.UuidUtil;
import com.skiving.cloud.constant.AdminConstant;
import com.skiving.cloud.logutils.OperateLogLocal;
import lombok.extern.slf4j.Slf4j;
import org.noear.solon.annotation.*;
import com.skiving.cloud.admin.entity.SysStation;
import com.skiving.cloud.admin.service.SysStationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.noear.solon.core.util.MimeType;

import java.time.LocalDateTime;
import java.util.*;

/**
 * 岗位表 控制层。
 *
 * @author skivingcloud
 * @since 2025-03-08
 */
@Slf4j
@Controller
@Api("岗位表接口")
@Mapping("/sysStation")
@Produces(MimeType.APPLICATION_JSON_UTF8_VALUE)
public class SysStationController {

    @Inject
    private SysStationService sysStationService;
    @Inject
    private SysStationMenuService sysStationMenuService;
    @Inject
    private SysMenuService sysMenuService;
    /**
     * 添加岗位表。
     *
     * @param sysStation 岗位表
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @Post
    @Mapping("/save")
    @ApiOperation("保存岗位表")
    @OperateLogLocal(module="系统管理-岗位管理", description = "新增岗位")
    public ReturnT<Boolean> save(@Body @ApiParam("岗位表") SysStation sysStation) {
        QueryWrapper queryWrapper = QueryWrapper.create();
        queryWrapper.where(SysStation::getStationCode).eq(sysStation.getStationCode());
        boolean exists = sysStationService.exists(queryWrapper);
        if(exists){
            return ReturnT.error("岗位编号重复！");
        }
        sysStation.setId(UuidUtil.get32UUID());
        sysStation.setCreater(UserUtil.getCurrentUser().getId());
        sysStation.setCreateTime(LocalDateTime.now());
        return ReturnT.ok(sysStationService.save(sysStation));
    }

    /**
     * 根据主键删除岗位表。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @Get
    @Mapping("/remove/{id}")
    @ApiOperation("根据主键岗位表")
    @OperateLogLocal(module="系统管理-岗位管理", description = "删除岗位")
    public ReturnT<Boolean> remove(@Path @ApiParam("岗位表主键") String id) {
        return ReturnT.ok(sysStationService.removeById(id));
    }

    /**
     * 根据主键更新岗位表。
     *
     * @param sysStation 岗位表
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @Post
    @Mapping("/update")
    @ApiOperation("根据主键更新岗位表")
    @OperateLogLocal(module="系统管理-岗位管理", description = "修改岗位")
    public ReturnT<Boolean> update(@Body @ApiParam("岗位表主键") SysStation sysStation) {
        QueryWrapper queryWrapper = QueryWrapper.create();
        queryWrapper.where(SysStation::getStationCode).eq(sysStation.getStationCode())
                .and(SysStation::getId).ne(sysStation.getId());
        boolean exists = sysStationService.exists(queryWrapper);
        if(exists){
            return ReturnT.error("岗位编号重复！");
        }
        sysStation.setModUser(UserUtil.getCurrentUser().getId());
        sysStation.setModTime(LocalDateTime.now());
        return ReturnT.ok(sysStationService.updateById(sysStation));
    }

    /**
     * 查询所有岗位表。
     *
     * @return 所有数据
     */
    @Get
    @Mapping("/list")
    @ApiOperation("查询所有岗位表")
    public ReturnT<List<SysStation>> list() {
        return ReturnT.ok(sysStationService.list());
    }

    /**
     * 根据岗位表主键获取详细信息。
     *
     * @param id 岗位表主键
     * @return 岗位表详情
     */
    @Get
    @Mapping("/getInfo/{id}")
    @ApiOperation("根据主键获取岗位表")
    public ReturnT<SysStation> getInfo(@Path @ApiParam("岗位表主键") String id) {
        return ReturnT.ok(sysStationService.getById(id));
    }

    /**
     * 分页查询岗位表。
     *
     * @param parameter 分页对象
     * @return 分页对象
     */
    @Post
    @Mapping("/page")
    @ApiOperation("分页查询岗位表")
    public ReturnT<Page<SysStation>> page(@Body @ApiParam("分页信息") PageParameter<SysStation> parameter) {
        return ReturnT.ok(sysStationService.queryByPage(parameter));
    }

    /**
     * 获取岗位资源树，如果不是超级管理员只返回自己租户的资源
     *
     * @param params {tenant:'租户id', id:'岗位id'}
     * @return 岗位资源权限
     */
    @ApiOperation("获取岗位资源树")
    @Post
    @Mapping("/getTenantStationResTree")
    public ReturnT<Map<String, Object>> getTenantStationResTree(@Body Map<String, Object> params) {
        String tenantId = params.get("tenantId") == null ? null : params.get("tenantId").toString();
        if (!UserUtil.getCurrentUser().getTenantId().equals(AdminConstant.SUPER_ADMIN_TENANT_ID)) {
            tenantId = UserUtil.getCurrentUser().getTenantId();
        }
        if (tenantId == null) {
            return ReturnT.error("租户不明确没数据");
        }
        List<SysMenu> list = sysMenuService.getTenantMenuList(tenantId);
        List<SysStationMenu> asingRes = new ArrayList<>();
        if (params.get("id") != null && !"".equals(params.get("id"))) {
            QueryWrapper queryWrapper = QueryWrapper.create();
            queryWrapper.where(SysStationMenu::getStationId).eq(params.get("id").toString());
            asingRes =sysStationMenuService.list(queryWrapper);
        }
        Map<String, Object> res = new HashMap<>();
        res.put("tree", list);
        res.put("asingRes", asingRes);
        return ReturnT.ok(res);
    }

    @ApiOperation("删除岗位")
    @Post
    @Mapping("/delete")
    @OperateLogLocal(module="系统管理-岗位管理", description = "删除岗位")
    public ReturnT<String> delete(@Body String[] ids){
        try{
            sysStationService.deleteBatch(ids);
            return ReturnT.ok("删除岗位成功");
        }catch(Exception e){
            log.error("删除岗位失败", e);
            return ReturnT.error("删除岗位失败");
        }
    }

    /**
     * 删除岗位的资源权限
     * @param ids 岗位id
     * @return 结果
     */
    @ApiOperation("删除岗位资源权限")
    @Post
    @Mapping("/deleteStationRes")
    @OperateLogLocal(module="系统管理-岗位管理", description = "删除岗位的资源权限")
    public ReturnT<String> deleteStationRes(@Body String[] ids) {
        try {
            QueryWrapper queryWrapper = QueryWrapper.create()
                    .where(SysStationMenu::getStationId).in(Arrays.stream(ids).toList());
            sysStationMenuService.remove(queryWrapper);
            return ReturnT.ok();
        } catch (Exception e) {
            log.error("删除岗位资源权限失败", e);
            return ReturnT.error("删除岗位资源权限失败");
        }
    }

    /**
     * 设置岗位资源权限
     * @param station 岗位资源信息
     * @return 结果
     */
    @Post
    @Mapping("/saveStationRes")
    @ApiOperation("设置岗位资源权限")
    @OperateLogLocal(module="系统管理-岗位管理", description = "设置岗位资源权限")
    public ReturnT<String> saveStationRes(@Body SysStation station) {
        try {
            sysStationService.saveStationRes(station.getId(), station.getResId());
            return ReturnT.ok();
        } catch (Exception e) {
            log.error("设置资源权限失败", e);
            return ReturnT.error("设置资源权限失败");
        }
    }
}
